/*
	Сбор данных, формирование выходов, считывание дискретных сигналов
*/

#include "defines.h"

U64 collectTime=0;
//Состояние входов
U8 	Inputs;
//Счетчик входных импульсов
U8 countInputs[8];

U8 prevCountInputs[8];

//Тут данные, которые мы временно храним
U8 P32LocalData[10*1024];
U16 P32LocalDataCount;

//Для подсчета входных импульсов
U64 InputEdgeTime[8];
//Текущее и предыдущее состояние входов
U8 currentInputs[8];
U8 prevInputs[8];

/*
	Собираем все необходимые данные
*/
void collect_data_prc(void)
{
	U16 i;
	P32T data;
	
	//Если флэшка готова и есть данные которые необходимо записать
	if (P32LocalDataCount)
	{
		if (sd_ok)
		{
			for (i=0;i<P32LocalDataCount;i++)
			{
				data = *((P32T *)&P32LocalData[i*sizeof(P32T)]);
				journal_write_record(&data);
			}
			printf("Write from SRAM to SD OK\r\n");
			P32LocalDataCount=0;
		}
	}
	
	//Пора опрашивать станок?
	if (SystemTick-collectTime>=mainConfig.mainInterval)
	{
		printf("Collect Data\r\n");
		collectTime = SystemTick;
		
		
		//Сначала очистим данные
		memset((U8 *)&data,0x00,sizeof(data));
		
		data.ticks = rtc_get_time_in_ticks(); //Текущее время в тиках
		data.adc = adc_get_average(); //АЦП
		//data.power = power_get_average();//Плата мощности
		
		//Опрос дискретных входных сигналов
		for (i=0;i<8;i++)
		{
			if(currentInputs[i]==mainConfig.input_levels[i])
			{
				//Если счетчик не изменился, значит за период опроса станка никаких импульсов не было
				if (prevCountInputs[i]==countInputs[i])
					Inputs|=(1<<i);
			}
			prevCountInputs[i] =countInputs[i];
		}
		
		printf("Inputs: 0x%0x\r\n",Inputs);
		printf("adc1:%d adc2:%d adc3:%d adc4:%d\r\n",data.adc.adc1,data.adc.adc2,data.adc.adc3,data.adc.adc4);
		printf("power:%d %d %d %d %d %d %d %d\r\n",data.power.powerFull, data.power.powerActive, data.power.voltageA,data.power.currentA,data.power.voltageB,data.power.currentB,data.power.voltageC,data.power.currentC);
			
		//Сохраняем данные в журнал
		if(sd_ok)
			journal_write_record(&data);
		//Флэшка не готова - надо сохранять во внутреннюю память
		else
		{
			printf("Write to SRAM\r\n");
			
			//Мало место - пора обнулять
			if (P32LocalDataCount>=P32_LOCAL_MAX_COUNT)
				P32LocalDataCount=0;
		
			//Пишем данные
			memcpy(P32LocalData+P32LocalDataCount*sizeof(P32T),&data,sizeof(P32T));	
			//Увеличиваем счетчик
			P32LocalDataCount++;
			
		}
				
		//Формируем выходы
		mon_out_(Inputs);	
		
		//Очистка входов
		Inputs=0;
	}
}

/*
	Подсчет входных импульсов
*/
void count_inputs()
{
	U8 i;
	for(i=0;i<8;i++)
	{
		//Считываем вход
		currentInputs[i] = inputs_read(i);
		//Фронт
		if (currentInputs[i]!=prevInputs[i])
			InputEdgeTime[i] = SystemTick;
		//Нет фронта
		else if (InputEdgeTime[i]&&(SystemTick-InputEdgeTime[i]>=INPUTS_THRESHOLD))
		{
			if (currentInputs[i]==mainConfig.input_levels[i])
					countInputs[i]++;
			InputEdgeTime[i]=0;	
		}
		
		prevInputs[i] = currentInputs[i];
	}
}

